#!usr/bin/env node

const log=console.log,
    arg=process.argv,
    stdin=process.stdin, 
    exit=process.exit;

var p=[];
var i=0;


//打印帮助文档
if(arg.length===3 && ( arg[2]==='-h' || arg[2]==='--help')){
    log('请参考帮助文档');
    exit();
}

//命令行参数输入
if(arg.length>2 && getNum()){
    log('\np=%j\n',p);
    log(`entropy(p)=${entropy(p)} bit`);
    exit();

}


//命令行参数输入,需要清空p
p=[];
log('\n请输入信源概率分布：(ctrl+C 退出输入)');
log('p%d:',i);

stdin.on('data',data=>{
    if(isLegal(data)){
        p.push(Number(data));
    }

    if(sum(p)===1){ 
        log('\np=%j\n',p);
        log(`entropy(p)=${entropy(p)} bit`);
        exit();
    }else{ 
        log('p%d:',++i);
    }
});



function getNum(){
        
    //检验是否合法?先存进去在检验
    //以逗号分隔输入
    if(arg.length===3){
        p=arg[2].split(',');
    }else{ //以空格分隔
        for(var i=2;i<arg.length;i++){
            p.push(arg[i]);
        }
    }

    for(var i=0;i<p.length;i++){//否则p中存的是字符
        if(!isLegal(p[i])){
            log('数据不合法！');
            return false;//有return false才不会继续执行
        }else{
            p[i]=Number(p[i]);
        }
    }

    //检查和为1
    if(sum(p)!==1){
        log('概率空间不封闭');
        return false;
    }
     return true;
}


function sum(p) {
    // return p.reduce((total, pi) => {//求和
    //   return roundFractional(total + Number(pi), 2);
    // }, 0);
    var num=0;
    for(var i=0;i<p.length;i++){
        num+=p[i];
    }
    return num;
  }

//检验每一项的合法性
function isLegal(data){
    if(isNaN(Number(data))) {
        log('请输入数字！');        
        return false; 
    } 
    if(Number(data) < 0) {
         log('请输入大于 0 的数！'); 
         return false; 
        } 
    if(Number(data) > 1) {
        log('请输入小于 1 的数！');
        return false; 
    } 
    if(sum(p) > 1) { 
        log('概率和超过了 1！');    
        return false; 
    }
    return true;
}

//计算信源熵
function entropy(p){ 
    return p.reduce((total,pi)=>{
      return total - pi*Math.log2(pi);
    },0);
}


  